// #include <stdio.h>
// #include <stdlib.h>
// #include "windows.h"
//
// #define MAX_SIZE 100 // 最大表长
// #define BLOCK_SIZE 10 // 每个块的大小
//
// typedef struct {
//     int data[MAX_SIZE];
//     int length;
// } SeqList;
//
// typedef struct {
//     int index[MAX_SIZE / BLOCK_SIZE];
//     int length;
// } IndexTable;
//
// // 初始化顺序表
// void InitSeqList(SeqList* L, int* arr, int n) {
//     for (int i = 0; i < n; i++) {
//         L->data[i] = arr[i];
//     }
//     L->length = n;
// }
//
// // 初始化索引表
// void InitIndexTable(SeqList* L, IndexTable* T) {
//     int numBlocks = (L->length + BLOCK_SIZE - 1) / BLOCK_SIZE; // 计算块的数量
//     for (int i = 0; i < numBlocks; i++) {
//         T->index[i] = L->data[(i + 1) * BLOCK_SIZE - 1]; // 设置索引表
//     }
//     T->length = numBlocks;
// }
//
// // 顺序查找（带哨兵）
// int SequentialSearch(SeqList* L, int target) {
//     int i = L->length - 1; // 从最后一个元素开始
//     while (i >= 0 && L->data[i] != target) {
//         i--;
//     }
//     return (i >= 0) ? i : -1; // 如果找到返回索引，否则返回 -1
// }
//
// // 二分查找
// int BinarySearch(IndexTable* T, int target) {
//     int low = 0, high = T->length - 1;
//     while (low <= high) {
//         int mid = (low + high) / 2;
//         if (T->index[mid] == target) {
//             return mid;
//         } else if (T->index[mid] > target) {
//             high = mid - 1;
//         } else {
//             low = mid + 1;
//         }
//     }
//     return low - 1; // 返回目标块的索引
// }
//
// // 分块查找
// int BlockSearch(SeqList* L, IndexTable* T, int target) {
//     int blockIndex = BinarySearch(T, target); // 在索引表中查找目标块
//     if (blockIndex == -1) {
//         return -1; // 如果未找到目标块，返回 -1
//     }
//     int start = blockIndex * BLOCK_SIZE; // 计算目标块的起始位置
//     int end = start + BLOCK_SIZE - 1; // 计算目标块的结束位置
//     if (end >= L->length) {
//         end = L->length - 1; // 如果超出表长，调整结束位置
//     }
//     return SequentialSearch(L, target) - start; // 在目标块内顺序查找
// }
//
// int main() {
//     SetConsoleOutputCP(CP_UTF8);
//     int arr[] = {10, 20, 30, 40, 50, 60, 70, 80, 90, 100};
//     int n = sizeof(arr) / sizeof(arr[0]);
//
//     SeqList L;
//     InitSeqList(&L, arr, n);
//
//     IndexTable T;
//     InitIndexTable(&L, &T);
//
//     int target = 60;
//     int index = BlockSearch(&L, &T, target);
//     if (index != -1) {
//         printf("元素 %d 位于索引 %d\n", target, index);
//     } else {
//         printf("未找到元素 %d\n", target);
//     }
//
//     return 0;
// }